/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Compilador;

/**
 *
 * @author Analia
 */

public class Scanner
{
    private final char EOLN = '\n';
    private final char EOF = '\0';
    private final char ESPACIO = ' ';
    private final char TAB = '\t';

    private Linea linea;
    private Token token;

    public Scanner()
    {
        token = new Token();
        linea = new Linea();
    }

    public void setLinea(Object m)
    {
        this.linea = (Linea)m;
    }

    public Object getLinea()
    {
        return this.linea;
    }
    

    private void dt()
    {
        byte estado = 0;
        char cc;
        String ac = "";

        while (true)
        {
            if (linea.finLinea())
            {
                token.setToken(token.getToken().FIN, "_");
                return;
            }
            cc = linea.getCharPuntero();

        switch (estado)
        {
            case 0:
                {
                    while (esEspacio(cc))
                    {
                        linea.avanzar();
                        cc = linea.getCharPuntero();
                    }

                    if (this.esDigito(cc))
                    {
                        ac = "" + cc;

                        linea.avanzar();

                        if (linea.getPuntero() < linea.getLongitudLinea())
                        {
                            cc = linea.getCharPuntero();
                            estado = 6;
                        } 
                        else
                        {
                            token.setToken(token.getToken().NUMERO,new Integer(ac));
                            return;
                        }

                        break;

                    } 
                    else
                    {
                        if (this.esLetra(cc))
                        {
                            ac = "" + cc;
                            if (linea.getPuntero() < linea.getLongitudLinea())
                            {
                                linea.avanzar();
                                estado = 8;
                            } 
                            else
                            {
                                token.setToken(token.getToken().ID, ac);
                                return;
                            }

                             break;
                        } 
                        else
                        {
                            switch (cc)
                            {
                            case ',':
                                {
                                    token.setToken(token.getToken().COMA, "_");
                                    linea.avanzar();
                                    return;
                                }
                            case ';':
                                {
                                    token.setToken(token.getToken().PTOCOMA, "_");
                                    linea.avanzar();
                                    return;
                                }
                            case ':':
                                {
                                    token.setToken(token.getToken().DOSPTOS, "_");
                                    linea.avanzar();
                                    return;
                                }

                            case '[':
                                {
                                    token.setToken(token.getToken().CA, "_");
                                    linea.avanzar();
                                    return;
                                }
                            case ']':
                                {
                                    token.setToken(token.getToken().CC, "_");
                                    linea.avanzar();
                                    return;
                                }

                            case EOF:

                                token.setToken(token.getToken().FIN, "_");

                            default:
                                token.setToken(token.getToken().ERROR, "_");

                            } 

                         } 
                    } 


                } 

            case 6: 
                {        
                    while (linea.getPuntero() < linea.getLongitudLinea() && esDigito(cc))
                    {
                        ac = ac + cc;
                        linea.avanzar();

                        if (linea.getPuntero() < linea.getLongitudLinea())
                            cc = linea.getCharPuntero();
                        else
                            cc = ' ';
                    }

                    if (esDigito(cc))
                        ac = ac + cc;

                    token.setToken(token.getToken().NUMERO, new Integer(ac));
                    return;

                } 
            case 8: 
                {
                       while (linea.getPuntero() < linea.getLongitudLinea() &&
                           (esLetra(cc) || esDigito(cc)))
                       {
                        ac = ac + cc;
                        linea.avanzar();

                        if (linea.getPuntero() < linea.getLongitudLinea())
                            cc = linea.getCharPuntero();
                        else
                            cc = ' ';
                    }

                    if (cc == '_')
                    {
                        ac = ac + cc;
                        linea.avanzar();

                        if (linea.getPuntero() < linea.getLongitudLinea())
                            cc = linea.getCharPuntero();

                        while (linea.getPuntero() < linea.getLongitudLinea() &&
                               (esLetra(cc) || esDigito(cc)))
                        {
                            ac = ac + cc;
                            linea.avanzar();

                            if (linea.getPuntero() < linea.getLongitudLinea())
                                cc = linea.getCharPuntero();
                            else
                                cc = ' ';
                        }
                    }

                    if (esLetra(cc) || esDigito(cc))
                        ac = ac + cc;

                       
                    if (this.esComando(ac))
                    {
                        return;
                    }

                    token.setToken(token.getToken().ID, ac);
                    return;
                } 


          } 

        } 
    }

    private boolean esEspacio(char c)
    {
       
        return c == ' ' || c == EOLN;
    }

    private boolean esDigito(char c)
    {
        return c == '0' || c == '1' || c == '2' || c == '3' || c == '4' ||
            c == '5' || c == '6' || c == '7' || c == '8' || c == '9';
    }

    private boolean esComando(String cadena)
    {
        cadena = cadena.toUpperCase();

        if (cadena.equals("AYUDA"))
        {
            token.setToken(token.getToken().AYUDA, "_");
            return true;
        }
        if (cadena.equals("REGISTRAR_USUARIO"))
        {
            token.setToken(token.getToken().REGISTRAR_USUARIO, "_");
            return true;
        }
        if (cadena.equals("REGISTRAR_ALUMNO"))
        {
            token.setToken(token.getToken().REGISTRAR_ALUMNO, "_");
            return true;
        }
        if (cadena.equals("REGISTRAR_DOCENTE"))
        {
            token.setToken(token.getToken().REGISTRAR_DOCENTE, "_");
            return true;
        }
        if (cadena.equals("REGISTRAR_DIRECTOR"))
        {
            token.setToken(token.getToken().REGISTRAR_DIRECTOR, "_");
            return true;
        }
        if (cadena.equals("REGISTRAR_MATERIA"))
        {
            token.setToken(token.getToken().REGISTRAR_MATERIA, "_");
            return true;
        }
        if (cadena.equals("REGISTRAR_GRUPO"))
        {
            token.setToken(token.getToken().REGISTRAR_GRUPO, "_");
            return true;
        }
        if (cadena.equals("RE_ALUMNOMATERIA"))
        {
            token.setToken(token.getToken().RE_ALUMNOMATERIA, "_");
            return true;
        }
        if (cadena.equals("RE_DOCENTEMATERIA"))
        {
            token.setToken(token.getToken().RE_DOCENTEMATERIA, "_");
            return true;
        }
        if (cadena.equals("RE_EXAMEN"))
        {
            token.setToken(token.getToken().RE_EXAMEN, "_");
            return true;
        }
        if (cadena.equals("RE_PROGRAMACION"))
        {
            token.setToken(token.getToken().RE_PROGRAMACION, "_");
            return true;
        }


        if (cadena.equals("RE_TIPOPREGUNTA"))
        {
            token.setToken(token.getToken().RE_TIPOPREGUNTA, "_");
            return true;
        }
        if (cadena.equals("RE_PREGUNTA"))
        {
            token.setToken(token.getToken().RE_PREGUNTA, "_");
            return true;
        }
        if (cadena.equals("RE_RESPUESTA"))
        {
            token.setToken(token.getToken().RE_RESPUESTA, "_");
            return true;
        }








/*
        if (cadena.equals("CANCELAR_PRODUCTO"))
        {
            token.setToken(token.getToken().CANCELAR_PRODUCTO, "_");
            return true;
        }

        
        
        if (cadena.equals("RESERVAR_PRODUCTO"))
        {
            token.setToken(token.getToken().RESERVAR_PRODUCTO, "_");
            return true;
        }

        if (cadena.equals("LISTAR_CLIENTES"))
        {
            token.setToken(token.getToken().LISTAR_CLIENTES, "_");
            return true;
        }

        if (cadena.equals("LISTAR_PRODUCTO"))
        {
            token.setToken(token.getToken().LISTAR_PRODUCTO, "_");
            return true;
        }
        if (cadena.equals("LISTAR_RESCLI"))
        {
            token.setToken(token.getToken().LISTAR_RESCLI, "_");
            return true;
        }
        
        if (cadena.equals("LISTAR_PROMOCION"))
        {
            token.setToken(token.getToken().LISTAR_PROMOCION, "_");
            return true;
        }
        if (cadena.equals("RESERVAS_CLIENTE"))
        {
            token.setToken(token.getToken().RESERVAS_CLIENTE, "_");
            return true;
        }
        if (cadena.equals("DETALLE_RESERVAS"))
        {
            token.setToken(token.getToken().DETALLE_RESERVAS, "_");
            return true;
        }
        if (cadena.equals("REGISTRAR"))
        {
            token.setToken(token.getToken().REGISTRAR, "_");
            return true;
        }

        if (cadena.equals("CANCELAR_RESERVA"))
        {
            token.setToken(token.getToken().CANCELAR_RESERVA, "_");
            return true;
        }*/



        //      bolsa de trabajo
        /*
        if (cadena.equals("OFERTA_GENERAL"))
        {
            token.setToken(token.getToken().REGISTRAR_OFERTA, "_");
            return true;
        }

        if (cadena.equals("REGISTRAR_OFERTA"))
        {
            token.setToken(token.getToken().REGISTRAR_OFERTA, "_");
            return true;
        }
        if (cadena.equals("MODIFICAR_FECHA_LIMITE"))
        {
            token.setToken(token.getToken().MODIFICAR_FECHA_LIMITE, "_");
            return true;
        }

        if (cadena.equals("ELIMINAR_OFERTA"))
        {
            token.setToken(token.getToken().ELIMINAR_OFERTA, "_");
            return true;
        }






        if (cadena.equals("LISTAR_USUARIOS"))
        {
            token.setToken(token.getToken().LISTAR_USUARIOS, "_");
            return true;
        }
           if (cadena.equals("LISTAR_AREA"))
        {
            token.setToken(token.getToken().LISTAR_AREA, "_");
            return true;
        }
           if (cadena.equals("LISTAR_EMPRESA"))
        {
            token.setToken(token.getToken().LISTAR_EMPRESA, "_");
            return true;
        }
           if (cadena.equals("LISTAR_TITULO"))
        {
            token.setToken(token.getToken().LISTAR_TITULO, "_");
            return true;
        }
           if (cadena.equals("BUSCAR_OFERTA"))
        {
            token.setToken(token.getToken().BUSCAR_OFERTA, "_");
            return true;
        }

       if (cadena.equals("LISTAR_OFERTAS"))
        {
            token.setToken(token.getToken().LISTAR_OFERTAS, "_");
            return true;
        }
*/


        //REGISTRAR_OFERTA, OFERTA_GENERAL

        return false;

    }

    private boolean esLetra(char c)
    {
        short rango = (short)c;
        // PARA MAYUSCULAS
        return
            //para minusculas
            (rango >= 65 && rango <= 90) || (rango >= 97 && rango <= 122);
    }


    public Token getToken()
    {
        return this.token;
    }

    public Object getAtr()
    {
        return token.getValor();
    }

    public void avanzar()
    {
        dt();
    }
 }